package com.itheima.wechat;

import cn.hutool.core.lang.UUID;
import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import com.aliyuncs.exceptions.ClientException;
import com.itheima.MemberService;
import com.itheima.OrderService;
import com.itheima.contant.MessageConstant;
import com.itheima.contant.RedisMessageConstant;
import com.itheima.entity.Result;
import com.itheima.pojo.LoginVCS;
import com.itheima.pojo.Member;
import com.itheima.pojo.Order;
import com.itheima.utils.SMSUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.JedisPool;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

@RestController
@RequestMapping("/login")
public class LoginController {


    @Autowired
    private JedisPool jedisPool;

    @Reference
    private MemberService memberService;

    @RequestMapping("/check")
    public Result submit(@RequestBody LoginVCS loginVCS, HttpServletResponse response) {

        //TODO : 前台传回的结果的格式    身份证号 ：idCard
        //      {telephone=12, validateCode=1}

        Result result = vaGraphic(loginVCS.getGraphicCode(),"图形验证码输入错误，您可以点击图片换一张");
        if (result.isFlag() == false){
            return result;
        }

        //1、验证码得输对

        try {
            /*获取用户输入的验证码*/
            String code = loginVCS.getValidateCode();
            /*获取用户输入的电话号码*/
            String telephone = loginVCS.getTelephone();
            /*取出数据库中的验证码*/

            String redisCode = jedisPool.getResource().get(telephone + RedisMessageConstant.SENDTYPE_LOGIN);
            /*如果没有向此电话号码发送验证码或用户输入验证码错误
             *   返回验证码输入错误 */
            if (redisCode == null || !redisCode.equals(code)) {
                return Result.error(MessageConstant.VALIDATECODE_ERROR);
            }

            /*将电话号码传到后台进行处理*/
            Member member = memberService.queryMember(telephone);

            /*cookie不安全，所以不好用
                因为以后会用集群，所以用redis来存储信息比较好，服务器校对时去redis找就好了*/

            /*用户输入的验证码正确，我们将用户的登录信息保存在Cookie中*/
//            Cookie cookie = new Cookie("telephone", telephone);
//            cookie.setMaxAge(60*60*24*30);
//            //使cookie可以在整个服务器都能访问到
//            cookie.setPath("/");
//            response.addCookie(cookie);

            /*TODO : 思路，用户登录时在服务器上生成随机码，将此随机码分别保存至前端与redis，
               在用户访问其它页面时，将前端的随机码返回到后端与redis中的随机码进行比对*/
            String memberString = JSON.toJSONString(member);
            String token = UUID.randomUUID().toString();
            jedisPool.getResource().set(token, memberString);

            return Result.success(MessageConstant.LOGIN_SUCCESS, token);
        } catch (Exception e) {
            return Result.success(MessageConstant.VALIDATECODE_ERROR);
        }
    }

    @RequestMapping("/sendCode")
    public Result sendCode(@RequestBody LoginVCS loginVCS){
        Result result = vaGraphic(loginVCS.getGraphicCode(),"您要先输入正确的图形验证码，才能发送短信");
        if (result.isFlag() == false){
            return result;
        }
        return Result.success("");
    }



    /**
     * 获取图形验证码并加以验证
     * @param loginVCSGraphicCode 用户输入的图形验证码
     * @param prompt 提示信息
     * @return
     */
    private Result vaGraphic(String loginVCSGraphicCode,String prompt){
        /*获取图形验证码*/
        String graphicCode = jedisPool.getResource().get(RedisMessageConstant.GRAPHICCODE_LOGIN);

        if (graphicCode == null || !graphicCode.equals(loginVCSGraphicCode)) {
            return Result.error(prompt);
        }
        return Result.success("");
    }
}
